import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import { File } from 'multer';
import { ApiResponse } from 'src/common/reponse.interface'; // 引入统一响应格式
import * as fs from 'fs';
import { join } from 'path';

@Injectable()
export class UploadService {
  constructor(private readonly prisma: PrismaService) {}

  // 保存文件或更新用户头像
  async saveUserFile(file: File, userId: number): Promise<ApiResponse<any>> {
    // 获取用户的当前头像
    const currentImage = await this.prisma.image.findFirst({
      where: { userId },
    });

    // 如果用户已有头像，删除旧的头像文件
    if (currentImage) {
      const oldFilePath = join(__dirname, '..', '..', currentImage.filepath); // 获取旧文件的完整路径
      fs.unlinkSync(oldFilePath); // 删除旧文件
      await this.prisma.image.delete({ where: { id: currentImage.id } }); // 删除数据库中的记录
    }

    // 保存新头像文件到数据库
    const newImage = await this.prisma.image.create({
      data: {
        filename: file.filename,
        filepath: file.path, // 新头像文件路径
        mimetype: file.mimetype,
        userId: userId, // 将新头像与用户关联
      },
    });

    return {
      statusCode: 200,
      message: '头像更新成功',
      data: newImage,
    };
  }

  // 保存分类图片
  async saveCategoryFile(
    file: File,
    categoryId: number,
  ): Promise<ApiResponse<any>> {
    // 检查是否有图片
    const currentImage = await this.prisma.categoryImage.findFirst({
      where: { categoryId: Number(categoryId) },
    });
    const image = await this.prisma.image.findFirst({
      where: { id: currentImage?.imageId },
    });
    // 如果有图片，删除旧的图片
    if (currentImage) {
      const oldFilePath = join(__dirname, '..', '..', image.filepath); // 获取旧文件的完整路径
      fs.unlinkSync(oldFilePath); // 删除旧文件
      await this.prisma.categoryImage.delete({
        where: { id: currentImage.id },
      }); // 删除数据库中的记录
    }
    const imageId = await this.saveImage(file); // 这是一个假设的方法，用于保存 Image 实例并返回其 ID

    // 保存分类图片到数据库
    const newImage = await this.prisma.categoryImage.create({
      data: {
        category: {
          connect: { id: Number(categoryId) }, // 连接到现有的分类
        },
        image: {
          connect: { id: imageId }, // 连接到现有的图片
        },
      },
    });

    return {
      statusCode: 200,
      message: '分类图片保存成功',
      data: newImage,
    };
  }

  // 假设的保存 Image 实例的方法
  async saveImage(file: File): Promise<number> {
    const newImage = await this.prisma.image.create({
      data: {
        filename: file.filename,
        filepath: file.path, // 新头像文件路径,
        mimetype: file.mimetype,
      },
    });
    return Number(newImage.id);
  }

  // 保存链接图片
  async saveLinkFile(file: File, linkId: number): Promise<ApiResponse<any>> {
    // 检查是否有图片
    const currentImage = await this.prisma.linkImage.findFirst({
      where: { linkId: Number(linkId) },
    });
    const image = await this.prisma.image.findFirst({
      where: { id: currentImage?.imageId },
    });
    // 如果有图片，删除旧的图片
    if (currentImage) {
      const oldFilePath = join(__dirname, '..', '..', image.filepath); // 获取旧文件的完整路径
      fs.unlinkSync(oldFilePath); // 删除旧文件
      await this.prisma.linkImage.delete({
        where: { id: currentImage.id },
      }); // 删除数据库中的记录
    }
    const imageId = await this.saveImage(file); // 这是一个假设的方法，用于保存 Image 实例并返回其 ID

    // 保存链接图片到数据库
    const newImage = await this.prisma.linkImage.create({
      data: {
        link: {
          connect: { id: Number(linkId) }, // 连接到现有的链接
        },
        image: {
          connect: { id: imageId }, // 连接到现有的图片
        },
      },
    });
    return {
      statusCode: 200,
      message: '链接图片保存成功',
      data: newImage,
    };
  }
}
